//字节序操作函数

#ifndef __ENDIAN_H__
#define __ENDIAN_H__

#include <byteswap.h>
#include <endian.h>
#include <stdint.h>
#include <type_traits>

//std::enable_if 的第一个模板参数是条件，如果条件为真，则第二个模板参数 T 被定义为 std::enable_if 的 type 成员；
//否则，std::enable_if 不定义任何 type，这将导致编译器在解析模板的过程中选择不使用这个函数。

//8字节类型字节序转换
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint64_t), T>::type //type为函数返回值
byteswap(T value)
{
    //bswap_64: 它的作用是将一个64位整数的高字节和低字节互换
    return (T)bswap_64((uint64_t)value);
}

//4字节类型字节序转换
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint32_t), T>::type 
byteswap(T value)
{
    return (T)bswap_32((uint32_t)value);
}

//2字节类型字节序转换
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint16_t), T>::type 
byteswap(T value)
{
    return (T)bswap_16((uint16_t)value);
}


//===========================================================================


#if BYTE_ORDER == BIG_ENDIAN   //如果当前是大端机器

template <class T>
T byteswapOnLittleEndian(T t)   //什么都不做
{
    return t;
}

template <class T>
T byteswapOnBigEndian(T t)      //执行转换 - 大端转小端
{
    return byteswap(t);
}

#else       //如果当前是小端机器

template <class T>
T byteswapOnLittleEndian(T t)   //执行转换 - 小端转大端
{
    return byteswap(t);
}

template <class T>
T byteswapOnBigEndian(T t)      //什么都不做
{
    return t;
}

#endif // BYTE_ORDER == BIG_ENDIAN


#endif //  __ENDIAN_H__